一、symbol是什麼?
創建symbol值:
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");
接續上一題,每一個symbol都是唯一的,請看下面示範:
sym2 === sym3; //false
Symbol("foo") === Symbol("foo"); //false
因為每個 Symbol 都是唯一的,所以可以使用它們作為唯一屬性名稱,這在防止名稱衝突或屬性覆蓋方面非常有用。
二、全域的Symbol註冊狀態(global Symbol registry)是什麼?
global Symbol registry是一個虛構的概念,它可能不對應 JavaScript 引擎內部的任何實際資料結構。藉由 Symbol.for() 和 Symbol.keyFor() 這兩個方法,才能取得global Symbol registry。
Symbol.for(key)
用來取得名稱為 key (字串) 的 global Symbol,如果不存在則會先建立一個新的存到 global symbol registry 後再返回。Symbol.keyFor(sym)
用來取得某個 global Symbol 的 key 名稱。let s = Symbol.for("shared");
let t = Symbol.for("shared");
Symbol.keyFor(t); //"shared"
Symbol.for()
與Symbol()
完全不同,Symbol()永遠不會重複回傳相同的值(上面有提到),但Symbol.for() 以相同字串被呼叫時,一定會回傳相同的值。Symbol.for() 以相同字串被呼叫時,一定會回傳相同的值:
let s = Symbol.for("shared");
let t = Symbol.for("shared");
s===t; //true
如果是Symbol() ,就不會相等:
Symbol("good") === Symbol("good"); //false
Symbol.for()
的字串,可以經由所回傳的Symbol的toString()輸出中得到:let s = Symbol.for("shared");
s.toString(); //"Symbol(shared)"
使用Symbol.keyFor()取出Symbol.for()中的字串,且兩者相等:
Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true
三、javaScript的object中的特性(包含一個名稱、一個值),是一種無序群集(unordered collection),無序群集是什麼?
// 創建一個 JavaScript 物件,其中特性之間的關係是無順序的
const myObject = {
name: "John",
age: 30,
city: "New York"
};
// 取出object內的值
console.log(myObject.name); // "John"
console.log(myObject.age); // 30
// 重複的鍵會覆蓋之前的值
myObject.name = "Alice";
console.log(myObject.name); // "Alice"已經覆蓋掉 "John"
Reference
https://www.fooish.com/javascript/ES6/Symbol.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol